package com.hw.springcloud.controller;

import com.hw.springcloud.service.FeignHystrixOrderService;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @Classname: FeignHystrixOrderController
 * @Description:    @DefaultProperties(defaultFallback = "defaultFallBack")
 *                  表示当前类下的全局服务降级方法是defaultFallBack,
 *                  如果单独配置服务降级的方法,就使用单独的降级方法.否则就使用全局的方法(defaultFallBack)
 * @Date: 2021/9/16
 * @Author: huwei
 */
@RequestMapping("/feign/hystrix")
@RestController
@DefaultProperties(defaultFallback = "defaultFallBack")
public class FeignHystrixOrderController {

    @Resource
    private FeignHystrixOrderService feignHystrixOrderService;

    @GetMapping("/test")
    public String linkTest() {
        return "链接成功";
    }

    @GetMapping("/success/{id}")
    public String getDataInfoSuccess(@PathVariable("id") String id) {
        return feignHystrixOrderService.getDataInfoSuccess(id);
    }

    /**
     * @HystrixCommand(fallbackMethod = "getDataInfoErrorMethod",commandProperties = {
     *          @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
     * })
     * 此注解表示当这个方法出现timeoutInMilliseconds线程的问题后,超过1.5秒钟,会调用getDataInfoErrorMethod方法进行兜底
     * 在yml中也需要配置一些东西
     */
    @GetMapping("/error/{id}")
    @HystrixCommand(fallbackMethod = "getDataInfoErrorMethod", commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500")
    })
    public String getDataInfoError(@PathVariable("id") String id) {
        return feignHystrixOrderService.getDataInfoError(id);
    }

    /**
     * 测试全局服务降级1
     *  @HystrixCommand注解如果没有单独配置服务降级的方法就只用类头上配置的全局的服务降级方法
     * @param id
     * @return
     */
    @GetMapping("/default/fallBack_1/{id}")
    @HystrixCommand
    public String defaultFallBack_1(@PathVariable("id") String id){
        // 设置一个错误,强行报错进行服务降级
        int age = 10/0;
        return feignHystrixOrderService.getDataInfoError(id);
    }

    /**
     * 测试全局服务降级2
     * @HystrixCommand注解如果没有单独配置服务降级的方法就只用类头上配置的全局的服务降级方法
     */
    @GetMapping("/default/fallBack_2/{id}")
    @HystrixCommand
    public String defaultFallBack_2(@PathVariable("id") String id){
        // 设置一个错误,强行报错进行服务降级
        int age = 10/0;
        return feignHystrixOrderService.getDataInfoError(id);
    }

    /**
     * 单独配置的服务降级方法
     * @param id
     * @return
     */
    public String getDataInfoErrorMethod(@PathVariable("id")String id){
        return "80端口,服务降级,id="+id;
    }

    /**
     * 全局配置的服务降级方法
     */
    public String defaultFallBack(){
        return "80端口,全局的服务降级";
    }
}
